# 作业：
# 2、定义一个学生Student类。有下面的类属性：
# 1 姓名 name
# 2 年龄 age
# 3 成绩 score（语文，数学，英语) [每课成绩的类型为整数]
#
#
# 类方法：
# 1 获取学生的姓名：get_name() 返回类型:str
# 2 获取学生的年龄：get_age() 返回类型:int
# 3 返回3门科目中最高的分数。get_course() 返回类型:int
# 4 将每个实例学生对象写进txt文件里，要持久保存
# 举例：{"姓名":"a","年龄":29,"成绩":{"语文":99,"数学":100,"英语":85}
# 5 获取所有学生的信息
#
# 写好类以后，可以定义2个同学测试下:
# zm = Student('zhangming',20,[69,88,100])
# 返回结果：
# zhangming
# 20
class Student:
    def __init__(self,name:str,age:int,score:dict):
        self.name = name
        self.age = age
        self.score = score
        with open('./StudentClass.txt','a',encoding='utf-8') as f:
            f.write(str({"姓名":self.name,"年龄":self.age,"成绩":{"数学":score['数学'],"语文":score['语文'],"英语":score["英语"]}}) +"\n")
    def get_name(self):
        return str(self.name)
    def get_age(self):
        return int(self.age)
    def get_course(self):
        score_0 = self.score['数学']
        max_score = {"最高成绩":{"数学":score_0}}
        for key,value in self.score.items():
            if value > score_0:
                max_score.update({"最高成绩":{key:value}})
        return max_score
    def get_studentinfo(self):
        with open('./StudentClass.txt','r',encoding='utf-8') as f:
            return f.read()

# student_1 = Student("小天才",19,{"数学":89,"语文":85,"英语":99})
# student_2 = Student("秦彪",39,{"数学":89,"语文":85,"英语":99})
# print(student_1.get_name())
# print(student_1.get_age())
# print(student_1.get_course())
# print(student_1.get_studentinfo())


# 3、定义一个字典类：dictclass。完成下面的功能：
# dict = dictclass({你需要操作的字典对象})
# 1 删除某个key
# del_dict(key)
# 2 判断某个键是否在字典里，如果在返回键对应的值，不存在则返回"not found"
# get_dict(key)
# 3 返回键组成的列表：返回类型;(list)
# get_key()
# 4 合并字典，并且返回合并后字典的values组成的列表。返回类型:(list)
# update_dict({要合并的字典})
# 100
class DictClass:
    def __init__(self,dict1):
        self.dict1 = dict1
    def del_dict(self,key):
        self.dict1.pop(key)
        return 0
    def get_dict(self,key):
        for keys,value in self.dict1.items():
            try:
                if self.dict1[keys] == self.dict1[key]:
                    return self.dict1[key]
            except:
                return "not found"
    def get_key(self):
        result_list = []
        for key in self.dict1.keys():
            result_list.append(key)
        return result_list
    def update_dict(self,dict2):
        self.dict1.update(dict2)
        return self.dict1
# score = {"数学":89,"语文":85,"英语":99}
# p1 = DictClass(score)
# print(p1.del_dict("数学"))
# print(score)
# print(p1.get_dict("地理"))
# print(p1.get_dict("语文"))
# print(p1.get_key())
# print(p1.update_dict({"地理":65}))


# 4、定义一个列表的操作类：Listinfo
#
# 包括的方法:
#
# 1 列表元素添加: add_key(keyname) [keyname:字符串或者整数类型]
# 2 列表元素取值：get_key(num) [num:整数类型]
# 3 列表合并：update_list(list) [list:列表类型]
# 4 删除并且返回最后一个元素：del_key()
#
# a = Listinfo([44,222,111,333,454,'sss','333'])
class Listinfo:
    def __init__(self,ListObject):
        self.ListObject = ListObject
    def add_key(self,keyname):
        self.ListObject.append(keyname)
        return 1
    def get_key(self,num):
        for i in range(len(self.ListObject)):
            if i == num-1:
                return self.ListObject[i]
        return 0
    def update_list(self,list1):
        if isinstance(list1,list):
            self.ListObject.extend(list1)
        else:
            self.ListObject.append(list1)
        return self.ListObject
    def del_key(self):
        value = self.ListObject[-1]
        self.ListObject.pop(-1)
        return value
# a = Listinfo([44,222,111,333,454,'sss','333'])
# a.add_key(999)
# print(a.ListObject)
# print(a.get_key(12))
# print(a.update_list(40))
# print(a.del_key())
# print(a.ListObject)



# 5、做一个学生点名系统，系统里支持：存入学生、更改学生、删除学生、点到学生姓名方法
#
# 存入学生（姓名、年龄、家庭地址、手机号）： 存入成功后，提示xxx存入成功
# 更改学生（姓名、年龄、家庭地址、手机号）：可以修改学生内容的任意一个字段
# 删除学生：删除的学生将不在展示
# 展示全部学生：可以看到全部的学生姓名
# 学生姓名：随机抽取任意一个存在的学生信息，然后打印：到！。举例： 刘闯到！
#
# student表：name、age、address、phone_number
class StudentTable:
    def __init__(self):
        self.dict1 = {}
    def insert_studentinfo(self,name,age,address,phone):
        if name not in self.dict1:
            self.dict1.update({name:{"年龄":age,"家庭地址":address,"手机号":phone}})
            return "存入成功！"
        else:
            return "已经存在了，无法重复插入！"
    def update_studentinfo(self,old_name,new_name,age,address,phone):
        if old_name in self.dict1.keys():
            self.dict1[new_name] = {"年龄":age,"家庭地址":address,"手机号":phone}
            del self.dict1[old_name]
            return "修改成功！"
        else:
            return 0
    def del_studentinfo(self,keyname):
        if keyname in self.dict1.keys():
            self.dict1.pop(keyname)
            return "删除成功！"
        else:
            return "不存在这个学生，无法删除！"
    def show_all_student(self):
        result_list = []
        for i in self.dict1.keys():
            result_list.append(i)
        return result_list
    def random_studentinfo(self):
        keys = [i for i in self.dict1.keys()]
        import random
        key = random.choice(keys)
        return f"{key}到！"

# p1 = StudentTable()
# dict2 = {}
# dict2.items()
# p1.insert_studentinfo("小天才",19,"沈阳",13596547896)
# p1.update_studentinfo("小天才","范庆才",99,"沈阳",15978996541)
# print(p1.dict1)
# print(p1.del_studentinfo("范庆才"))
# p1.insert_studentinfo("小天才1",19,"沈阳",13596547896)
# p1.insert_studentinfo("小天才2",19,"沈阳",13596547896)
# print(p1.show_all_student())
# print(p1.random_studentinfo())


# 6、点餐管理系统
# 1》、餐馆可以新增菜品、下架菜品、修改菜品
# 2》、每个菜品，都有对应的库存，所有菜品的库存均为999，每出一道菜，库存-1，默认是5分
# 菜品有对应的价格，餐厅老板定义价格每道菜不允许超过15元，没有小数单位，均为整数
# 3》、餐馆后台有点赞系统，能够收集客户对菜品的喜好，0~5分 ，默认是5分
# 4》、有菜品评分提报功能，对平均分数（菜品总分/打分人数）低于3分的菜品进行强制下架；

peoplenum = 0  # 这个是人数
score = 0 # 菜品的总分
class OrderManagementSystem:
    def __init__(self,order): # []
        self.Order = order
    def add_variety(self,name,price:int): # inventory score
        if price >=15:
            return "价格过大，添加菜品失败"
        self.Order.append({name:{"库存":999,"价格":price,"评分":5}})
        return "添加成功"
    def update_variety(self,oldname,newname,price):
        for i in self.Order:
            if i[oldname]:
                self.Order.append({newname:{"价格":price,"库存":999,"评分":5}})
                self.Order.remove(i)
    def Like(self,variety,score1):
        for i in range(len(self.Order)):
            if variety in self.Order[i].keys():
                if self.Order[i][variety]['库存'] == 0:
                    return "无法给这个菜品评分，菜品已经售罄了!"
        global peoplenum,score
        peoplenum+=1
        if score1 >0 and score1 <=5:
            score+=score1
            for i in range(len(self.Order)):
                if variety in self.Order[i].keys():
                    self.Order[i][variety]['评分'] = score
                    self.Order[i][variety]['库存'] -=1
        else:
            return "无法超过5分或者是负数"
    def ScoreSubmission(self,variety):
        global score,peoplenum
        for i in self.Order:
            if variety in i:
                result = score / peoplenum
                if result < 3:
                    self.Order.remove(i)

# p1 = OrderManagementSystem([])
# p1.add_variety("香辣肉丝",14)
# print(p1.Order)
# 
# p1.Like("香辣肉丝",5)
# p1.Like("香辣肉丝",5)
# p1.Like("香辣肉丝",5)
# print(p1.Order)






# 7、定义一个桌子类（Desk），包含长（length）、宽（width）、高（height）属性，包含一个打印桌子信息属性的方法（showInfo）。实例化2个桌子对象，为其赋予不同的属性值，
# 并调用showInfo方法，输出每个桌子的信息。
num = 1
class Desk:
    def __init__(self,length,width,height):
        self.length = length
        self.width = width
        self.height = height
    def showInfo(self):
        global num
        print(f"第{num}张桌子的属性：桌子的长是{self.length}cm,桌子的宽是{self.width}cm,桌子的高是{self.height}cm")
        num+=1

# d1 = Desk(50,30,100)
# d2 = Desk(60,40,120)
# d1.showInfo()
# d2.showInfo()





#
# 8、定义一个用户类(User),用户名(username)和密码(password)是这个类的属性。
class User:
    def __init__(self,username,password):
        self.username = username
        self.password = password



# 9、定义一个计算器类，有加减乘除四个方法
class Calculator:
    def __init__(self,a,b):
        self.a = a
        self.b = b
    def add(self):
        return self.a+self.b
    def reduce(self):
        return self.a-self.b
    def ride(self):
        return self.a*self.b
    def getridof(self):
        return self.a/self.b
# c1 = Calculator(5,6)
# print(c1.add())
# print(c1.reduce())
# print(c1.ride())
# print(c1.getridof())

#
# 10、创建一个名为Person的类，具有以下属性和方法：
#
# 属性：name（姓名），age（年龄）
# 方法：greet()，打印出一句问候语，包括该人的姓名和年龄
class Person:
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def greet(self):
        print(f"{self.name}，早上好，你今天迎来{self.age}岁生日！")

# p1 = Person("小天才",99)
# p1.greet()





# 11、定义一个图书管理系统类，图书可以新增、修改、删除，要求新增的每个图书都加到txt文本里，数据持久化
# 新增：图书名、作者名称、新建年月日
# 修改：图书名、作者名称、新建年月日
# 删除：图书删掉，且不在展示
# 查看：全量查询，精确查询，需要用户传入形参来控制返回结果
class BookManagerSystem:
    def __init__(self):
        self.book_dict = {}
    def add_book(self,name,Author,time1):
        with open('./book.txt','a',encoding='utf-8') as f:
            f.write(f"图书名:{name}")
            f.write(f"作者名称:{Author}")
            f.write(f"新建年月日:{time1}" + "\n")
        self.book_dict.update({name:{"作者名称":Author,"新建年月日":time1}})
    def update_book(self,old_name,new_name,Author,time1):
        if old_name in self.book_dict.keys():
            self.book_dict.update({new_name:{"作者名称":Author,"新建年月日":time1}})
            self.book_dict.pop(old_name)
            return 1
        else:
            return "图书不存在，无法修改！"
    def delete_book(self,name):
        try:
            for i in self.book_dict.keys():
                if i in name:
                    self.book_dict.pop(i)
        except:
            return f"图书已经被删掉"
    def search_book(self,type,name = None): # type = 1 ：精确查询 ，type = 2 ：全量查询
        num = 0
        if type == 1:
            if name:
                for i in self.book_dict.keys():
                    if i in name: # keys()
                        return f"您要查的图书名为：{name} , 作者名称为：{self.book_dict[i]['作者名称']} ,新建年月日为： {self.book_dict[i]['新建年月日']}"
        elif type == 2:
            for key,value in self.book_dict.items():
                num +=1
                print(f"第{num}本书的名称为：{key},作者名称为：{self.book_dict[key]['作者名称']}，新建年月日为：{self.book_dict[key]['新建年月日']}")



# b1 = BookManagerSystem()
# b1.add_book("小天才","范庆才","2023-8-28")
# b1.add_book("追风","秦彪","2023-8-28")
# b1.add_book("追风1","秦彪1","2023-8-28")
# print(b1.book_dict)
# b1.update_book("小天才","小天才plus","范庆才puls","2023-8-28")
# b1.search_book(2)
# print(b1.search_book(1, "小天才plus"))
# print(b1.delete_book("追风"))
# b1.search_book(2)


# 12、创建一个名为"Car"的类，该类具有"品牌"和"颜色"属性。创建一个"start_engine"方法，该方法打印出"启动汽车引擎！"的消息。创建一个"stop_engine"方法，该方法打印出"关闭汽车引擎！"的消息
class Car:
    def __init__(self,brand,colour):
        self.brand = brand
        self.colour = colour
    def start_engine(self):
        print("启动汽车引擎！")
    def stop_engine(self):
        print("关闭汽车引擎！")

# c1 = Car("奔驰","粉色")
#
# c1.start_engine()
# c1.stop_engine()
# 13、淘宝商家后台，可以上架商品、下架商品，功能如下：
#  （1） 可以添加商品，商家添加完的商品会存到商品列表
#  1.1  商品要有名称、sku、价格
#  （2） 可以修改商品信息：名称、sku、价格
#  （3） 可以对商品进行下架，下架后的商品不再展示

class MerchantBackend:
    def __init__(self):
        self.commodity = {}
    def add_commodity(self,name,sku,price):
        self.commodity.update({name:{"商品规格":sku,"商品价格":price}})
        return 1
    def update_commodity(self,old_name,new_name,sku,price):
        if old_name in self.commodity.keys():
            self.commodity.update({new_name: {"商品规格": sku, "商品价格": price}})
            self.commodity.pop(old_name)
            return 1
        else:
            return f"没有这个商品，无法修改！"
    def delete_commodity(self,name):
        if name in self.commodity.keys():
            try:
                for key in self.commodity.keys():
                    if name in key:
                        self.commodity.pop(name)
            except:
                return "删除商品成功！"
        else:
            return "没有这个商品，无法删除！"
    def show_commodity(self):
        num = 0
        for i in self.commodity.keys():
            num+=1
            print(f"第{num}件商品的名称为：{i},商品的规格为：{self.commodity[i]['商品规格']} ， 商品的价格为：{self.commodity[i]['商品价格']} 人民币/元")

# m1 = MerchantBackend()
# m1.add_commodity("小天才手表2023年最新款适合运动、外出、游泳防水！","件",198.56)
# m1.add_commodity("秦彪","个",98.56)
# m1.update_commodity("小天才手表2023年最新款适合运动、外出、游泳防水！","小天才手表","件",198.26)
#
# m1.delete_commodity("秦彪")
# m1.show_commodity()
# 14、定义一个人类
# 1.小明和小美都爱跑步
# 2.小美体重45.0公斤
# 3.小明体重75.0公斤
# 4.每次跑步都会减少0.5公斤
# 5.每次吃东西都会增加1公斤
class People:
    def __init__(self,kilogram:float):
        self.kilogram = kilogram

    def reduce(self):
        self.kilogram -=0.5

    def eat(self):
        self.kilogram +=1


# p1 = People(45.0)
# p2 = People(75.0)
# p1.reduce()
# print(p1.kilogram)
# p2.reduce()
# print(p2.kilogram)
# p1.eat()
# print(p1.kilogram)


# 15、士兵瑞恩有一把ak47
# 士兵可以开火（开火扣动的是班级）
# 抢能够发射子弹（把子弹打出去）
# 抢能够装子弹–增加子弹数量
#
# 要求没子弹，需要输出没有子弹了，且发射失败
class SoldierRyan:
    def __init__(self):
        self.bulletlist = 25
        self.nowbullet = 0
    def Ammunition(self):
        if self.bulletlist >= 5:
            self.nowbullet +=5
            self.bulletlist -=5
        else:
            print("弹药不足，添加失败！")
    def openfire(self,bullet): # bullet：子弹
        if self.nowbullet:
            if self.nowbullet >= bullet:
                self.nowbullet -=bullet
                print(f"发射成功！")
            else:
                print(f"发射失败，弹药不足，不够本次发射")

s1 = SoldierRyan()
s1.Ammunition()
s1.openfire(5)
s1.Ammunition()
print(s1.bulletlist)











